#!/usr/bin/env python
# -*- coding: utf-8 -*-:
# 用途:监控日志关键字
# 难点：一般日志是不会直接移动文件的，此脚本的监控的日志是移动归档，导致open中的对象获取不到内容
# 解决：用以的变量记录允许多少次为空，超出次数，关闭文件，重新打开
# 流程：
# 1.open 文件从末尾开始读
# 2.定义一个存储函数，存储报警日志。
# 3.定义一个动作函数，警报动作
# 4.定义一个判断函数，用于判断
# 5.定义一个标记记录，是否发送邮件
# 5.定义一个标记记录，是否重新打开文件
from emaills import SendEamil
from time import sleep


class Judge:
    """文件数据存储，触发动作类"""
    def __init__(self, pathfile, action):
        """
        :param pathfile: 文件名
        :param action: 动作模块
        :param keyword: 状态值，True: 有关键字 False： 没有关键字
        :param index: 触发动作计数值
        :param nullnum: 文件内容为空计数值
        :param data: 存储数据容器(限300条)
        """
        self.data = []
        self.nullnum = 1000
        self.index = 100
        self.keyword = False
        self.action = action
        self.pathfile = pathfile
        self.fileobject = ''
        self.infos = ''
        self.tmpvalues = ''
        self.fileobject = open(self.pathfile, 'r')
        self.fileobject.seek(0, 2)

    def cfile(self):
        """关闭文件"""
        self.fileobject.close()

    def storage(self, info):
        """存储200行信息"""
        if len(self.data) >= 200:
            self.data.pop(0)
        self.data.append(info)

    def judegs(self):
        """关键字判断"""
        # 获取文件内容
        self.tmpvalues = self.fileobject.readline()
        # print(self.tmpvalues)
        # 所有的数据都存最新的300行信息
        self.storage(self.tmpvalues)

        # 关键字判断
        if ('Exception' in self.tmpvalues or 'exception' in self.tmpvalues
                or 'ERROR' in self.tmpvalues or 'error' in self.tmpvalues):
            self.keyword = True
            # print('------------{}'.format(self.tmpvalues))

        # 为空统计
        if self.tmpvalues == '':
            self.nullnum -= 1

        # 达到一定值，重新打开文件
        if self.nullnum <= 0:
            self.cfile()
            self.fileobject = open(self.pathfile, 'r')
            self.fileobject.seek(0, 2)
            self.nullnum = 1000

        # 动作前数据存储，倒数计数
        if self.keyword is True:
            self.index -= 1
            # print('*** {}'.format(self.index))

        # 到达一定值，触发动作
        if self.index <= 0:
            self.actions()
            self.index = 100
            self.keyword = False
        sleep(0.1)

    def actions(self):
        """动作"""
        self.infos = '\n'.join(self.data)
        self.action(self.infos)


if __name__ == '__main__':
    judge = Judge('22.txt', SendEamil)
    while True:
        judge.judegs()
